package fr.bordeaux1.planingdesetudiants.view;

import java.sql.SQLException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;

import fr.bordeaux1.planingdesetudiants.model.Etudiant;
import fr.bordeaux1.planingdesetudiants.model.Groupe;
import fr.bordeaux1.planingdesetudiants.model.Ue;

public class ListerGroupes extends Composite {
	private IFenetrePrincipale fenetrePrincipale;
	private Combo listeUE;
	private Combo listeGrpA;
	private Combo listeGrpB;
	private List etusGrpA;
	private List etusGrpB;
	private Ue ueSelected;
	private Groupe sansGroupe;

	public ListerGroupes(Composite arg0, int arg1, final IFenetrePrincipale fenetrePrincipale) {
		super(arg0, arg1);
		this.fenetrePrincipale = fenetrePrincipale;
		this.setLayout(new FormLayout());
		
		sansGroupe = new Groupe();
		sansGroupe.setNom("Sans groupe");
		sansGroupe.setId(-1);

		Label nameE = new Label(this, SWT.NONE);
		FormData fd_nameE = new FormData();
		fd_nameE.left = new FormAttachment(0, 10);
		fd_nameE.top = new FormAttachment(0, 10);
		nameE.setLayoutData(fd_nameE);
		nameE.setText("Selectionner l'UE :");

		listeUE = new Combo(this, SWT.BORDER| SWT.READ_ONLY);
		FormData fd_listeUE = new FormData();
		fd_listeUE.left = new FormAttachment(nameE, 10);
		fd_listeUE.right = new FormAttachment(100, -10);
		fd_listeUE.top = new FormAttachment(0,5);

		listeUE.setLayoutData(fd_listeUE);
		java.util.List<Ue> res;
		try {
			res = fenetrePrincipale.getDb().listerUes();

			for (Ue ue : res){
				listeUE.add(ue.getCode() + " " + ue.getLibelle());
				listeUE.setData(ue.getCode() + " " + ue.getLibelle(), ue);
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
		Label lblGroupeA = new Label(this, SWT.NONE);
		lblGroupeA.setText("Groupe A :");
		FormData fd_lblGroupeA = new FormData();
		fd_lblGroupeA.top = new FormAttachment(listeUE, 30);
		fd_lblGroupeA.left = new FormAttachment(20, 0);
		fd_lblGroupeA.right = new FormAttachment(50, 0);
		lblGroupeA.setLayoutData( fd_lblGroupeA);
		
		Label lblGroupeB = new Label(this, SWT.NONE);
		lblGroupeB.setText("Groupe B :");
		FormData fd_lblGroupeB = new FormData();
		fd_lblGroupeB.top = new FormAttachment(listeUE, 30);
		fd_lblGroupeB.left = new FormAttachment(70, 0);
		fd_lblGroupeB.right = new FormAttachment(100, 0);
		lblGroupeB.setLayoutData( fd_lblGroupeB);
		
		listeGrpA = new Combo(this, SWT.NONE | SWT.READ_ONLY);
		FormData fd_listeGrpA = new FormData();
		fd_listeGrpA.top = new FormAttachment(lblGroupeA, 20);
		fd_listeGrpA.left = new FormAttachment(0, 10);
		fd_listeGrpA.right = new FormAttachment(50, -5);
		listeGrpA.setLayoutData( fd_listeGrpA);
		
		listeGrpB = new Combo(this, SWT.NONE | SWT.READ_ONLY);
		FormData fd_listeGrpB = new FormData();
		fd_listeGrpB.top = new FormAttachment(lblGroupeB, 20);
		fd_listeGrpB.left = new FormAttachment(50, 5);
		fd_listeGrpB.right = new FormAttachment(100, -10);
		listeGrpB.setLayoutData( fd_listeGrpB);
		
		etusGrpA = new List(this, SWT.BORDER| SWT.V_SCROLL);
		FormData fd_etusGrpA = new FormData();
		fd_etusGrpA.top = new FormAttachment(listeGrpA,20);
		fd_etusGrpA.left = new FormAttachment(0,10);
		fd_etusGrpA.right = new FormAttachment(50,-5);
		fd_etusGrpA.bottom = new FormAttachment(100,-10);
		etusGrpA.setLayoutData(fd_etusGrpA);
		
		etusGrpB = new List(this, SWT.BORDER| SWT.V_SCROLL);
		FormData fd_etusGrpB = new FormData();
		fd_etusGrpB.top = new FormAttachment(listeGrpB,20);
		fd_etusGrpB.left = new FormAttachment(50,5);
		fd_etusGrpB.right = new FormAttachment(100,-10);
		fd_etusGrpB.bottom = new FormAttachment(100,-10);
		etusGrpB.setLayoutData(fd_etusGrpB);
		
		final DropTarget targetA = new DropTarget(etusGrpA, DND.DROP_MOVE);
		final DropTargetListener dtlA = new DropTargetListener() {
			
			@Override
			public void dropAccept(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void drop(DropTargetEvent arg0) {
				if (TextTransfer.getInstance().isSupportedType(arg0.currentDataType)) {
					String num = (String) arg0.data;
					Etudiant etudiant = new Etudiant();
					etudiant.setNumero(Integer.parseInt(num));
					Groupe currentGroup = (Groupe) listeGrpA.getData(listeGrpA.getItem(listeGrpA.getSelectionIndex()));
					if (currentGroup.getId() != -1) {
						try {
							ListerGroupes.this.fenetrePrincipale.getDb().ajouterEtudiantAuGroupe(etudiant,currentGroup);
						} catch (SQLException e) {
							e.printStackTrace();
						}
					}
				}
			}
			
			@Override
			public void dragOver(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragOperationChanged(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragLeave(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragEnter(DropTargetEvent arg0) {
				
			}
		};

		targetA.addDropListener(dtlA);

		final DropTarget targetB = new DropTarget(etusGrpB, DND.DROP_MOVE);
		final DropTargetListener dtlB = new DropTargetListener() {
			
			@Override
			public void dropAccept(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void drop(DropTargetEvent arg0) {
				if (TextTransfer.getInstance().isSupportedType(arg0.currentDataType)) {
					String num = (String) arg0.data;
					Etudiant etudiant = new Etudiant();
					etudiant.setNumero(Integer.parseInt(num));
					Groupe currentGroup = (Groupe) listeGrpB.getData(listeGrpB.getItem(listeGrpB.getSelectionIndex()));
					if (currentGroup.getId() != -1) {
						try {
							ListerGroupes.this.fenetrePrincipale.getDb().ajouterEtudiantAuGroupe(etudiant,currentGroup);
						} catch (SQLException e) {
							e.printStackTrace();
						}
					}
				}
			}
			
			@Override
			public void dragOver(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragOperationChanged(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragLeave(DropTargetEvent arg0) {
				
			}
			
			@Override
			public void dragEnter(DropTargetEvent arg0) {
				
			}
		};
		
		targetB.addDropListener(dtlB);

		listeUE.addSelectionListener(new SelectionListener() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				try {
					
					Transfer[] types = new Transfer[] {  };
					targetA.setTransfer(types);
					targetB.setTransfer(types);
					
					listeGrpA.removeAll();
					listeGrpB.removeAll();
					etusGrpA.removeAll();
					etusGrpB.removeAll();
					
					ueSelected = (Ue) listeUE.getData(listeUE.getItem(listeUE.getSelectionIndex()));

					listeGrpA.add(sansGroupe.getNom());
					listeGrpA.setData(sansGroupe.getNom(), sansGroupe);
					listeGrpB.add(sansGroupe.getNom());
					listeGrpB.setData(sansGroupe.getNom(), sansGroupe);
					
					java.util.List<Groupe> grps = ListerGroupes.this.fenetrePrincipale.getDb().listerGroupeDeUe(ueSelected);
					for (Groupe grp : grps){
						listeGrpA.add(grp.getNom());
						listeGrpA.setData(grp.getNom(), grp);
						listeGrpB.add(grp.getNom());
						listeGrpB.setData(grp.getNom(), grp);
					}
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}

			@Override
			public void widgetDefaultSelected(SelectionEvent arg0) {
			}
		});
		
		listeGrpA.addSelectionListener(new SelectionListener() {
			
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				
				Transfer[] typesA = new Transfer[] { TextTransfer.getInstance() };
				targetA.setTransfer(typesA);
				
				Groupe groupe = (Groupe) listeGrpA.getData(listeGrpA.getItem(listeGrpA.getSelectionIndex()));
				try {
					String currentGrpB = listeGrpB.getText();
					listeGrpB.removeAll();
					if (groupe.getId()!=-1) {
						listeGrpB.add(sansGroupe.getNom());
						listeGrpB.setData(sansGroupe.getNom(), sansGroupe);
					}
					java.util.List<Groupe> grps = ListerGroupes.this.fenetrePrincipale.getDb().listerGroupeDeUe(ueSelected);
					for (Groupe grp : grps){
						if (grp.getId()!=groupe.getId()) {
							listeGrpB.add(grp.getNom());
							listeGrpB.setData(grp.getNom(), grp);
						}
					}
					updateA();
					listeGrpB.setText(currentGrpB);
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
			
			@Override
			public void widgetDefaultSelected(SelectionEvent arg0) {
				
			}
		});
		
		listeGrpB.addSelectionListener(new SelectionListener() {
			
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				
				Transfer[] typesB = new Transfer[] { TextTransfer.getInstance() };
				targetB.setTransfer(typesB);
				
				Groupe groupe = (Groupe) listeGrpB.getData(listeGrpB.getItem(listeGrpB.getSelectionIndex()));
				try {
					String currentGrpA = listeGrpA.getText();
					listeGrpA.removeAll();
					if (groupe.getId()!=-1) {
						listeGrpA.add(sansGroupe.getNom());
						listeGrpA.setData(sansGroupe.getNom(), sansGroupe);
					}
					java.util.List<Groupe> grps = ListerGroupes.this.fenetrePrincipale.getDb().listerGroupeDeUe(ueSelected);
					for (Groupe grp : grps){
						if (grp.getId()!=groupe.getId()) {
							listeGrpA.add(grp.getNom());
							listeGrpA.setData(grp.getNom(), grp);
						}
					}
					updateB();
					listeGrpA.setText(currentGrpA);
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
			
			@Override
			public void widgetDefaultSelected(SelectionEvent arg0) {
				
			}
		});

		DragSource sourceA = new DragSource(etusGrpA, DND.DROP_MOVE);
		Transfer[] typesA = new Transfer[] { TextTransfer.getInstance() };
		sourceA.setTransfer(typesA);
		sourceA.addDragListener(new DragSourceListener() {
			@Override
			public void dragStart(DragSourceEvent arg0) {

			}

			@Override
			public void dragSetData(DragSourceEvent arg0) {
				if (TextTransfer.getInstance().isSupportedType(arg0.dataType)) {
					Etudiant etudiant = ((Etudiant) etusGrpA.getData(etusGrpA.getItem(etusGrpA.getSelectionIndex())));
					Groupe currentGroup = (Groupe) listeGrpA.getData(listeGrpA.getItem(listeGrpA.getSelectionIndex()));
					if (currentGroup.getId() != -1) {
						try {
							ListerGroupes.this.fenetrePrincipale.getDb().retirerEtudiantDeGroupe(etudiant,currentGroup);
							ListerGroupes.this.fenetrePrincipale.updateStatusBar("Etudiant déplacé avec succès");
						} catch (SQLException e) {
							e.printStackTrace();
						}
					}
					arg0.data = "" + etudiant.getNumero();
				}
			}

			@Override
			public void dragFinished(DragSourceEvent arg0) {
				try {
					updateA();
					updateB();
					ListerGroupes.this.fenetrePrincipale.updateStatusBar("Etudiant déplacé avec succès");
				} catch (SQLException e) {
					e.printStackTrace();
				}
				ListerGroupes.this.fenetrePrincipale.modificationApportees();
			}
		});

		DragSource sourceB = new DragSource(etusGrpB, DND.DROP_MOVE);
		Transfer[] typesB = new Transfer[] { TextTransfer.getInstance() };
		sourceB.setTransfer(typesB);
		sourceB.addDragListener(new DragSourceListener() {
			@Override
			public void dragStart(DragSourceEvent arg0) {

			}

			@Override
			public void dragSetData(DragSourceEvent arg0) {
				if (TextTransfer.getInstance().isSupportedType(arg0.dataType)) {
					Etudiant etudiant = ((Etudiant) etusGrpB.getData(etusGrpB.getItem(etusGrpB.getSelectionIndex())));
					Groupe currentGroup = (Groupe) listeGrpB.getData(listeGrpB.getItem(listeGrpB.getSelectionIndex()));
					if (currentGroup.getId() != -1) {
						try {
							ListerGroupes.this.fenetrePrincipale.getDb().retirerEtudiantDeGroupe(etudiant,currentGroup);
						} catch (SQLException e) {
							e.printStackTrace();
						}
					}
					arg0.data = "" + etudiant.getNumero();
				}
			}

			@Override
			public void dragFinished(DragSourceEvent arg0) {
				try {
					updateA();
					updateB();
					ListerGroupes.this.fenetrePrincipale.updateStatusBar("Etudiant déplacé avec succès");
				} catch (SQLException e) {
					e.printStackTrace();
				}
				ListerGroupes.this.fenetrePrincipale.modificationApportees();
			}
		});
		
		
	}

	private void updateA() throws SQLException {
		
		int index = listeGrpA.getSelectionIndex();
		if (index != -1) {
			etusGrpA.removeAll();
			Groupe groupe = (Groupe) listeGrpA.getData(listeGrpA.getItem(index));
			java.util.List<Etudiant> result;
			if (groupe.getId() == -1)
				result = ListerGroupes.this.fenetrePrincipale.getDb().listerEtudiantsSansGroupeUe(ueSelected);
			else
				result = ListerGroupes.this.fenetrePrincipale.getDb().listerEtudiantsDeGroupe(groupe);
			for (Etudiant etu : result) {
				etusGrpA.add(etu.getNom() + " " + etu.getPrenom());
				etusGrpA.setData(etu.getNom() + " " + etu.getPrenom(), etu);
			}
		}
	}
	
	private void updateB() throws SQLException {
		
		int index = listeGrpB.getSelectionIndex();
		if (index != -1) {
			etusGrpB.removeAll();
			Groupe groupe = (Groupe) listeGrpB.getData(listeGrpB.getItem(index));
			java.util.List<Etudiant> result;
			if (groupe.getId() == -1)
				result = ListerGroupes.this.fenetrePrincipale.getDb().listerEtudiantsSansGroupeUe(ueSelected);
			else
				result = ListerGroupes.this.fenetrePrincipale.getDb().listerEtudiantsDeGroupe(groupe);
			for (Etudiant etu : result) {
				etusGrpB.add(etu.getNom() + " " + etu.getPrenom());
				etusGrpB.setData(etu.getNom() + " " + etu.getPrenom(), etu);
			}
		}
	}
}
